home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1998 January / Macworld (1998-01).dmg / Shareware World / Comms & Internet / HTML mode 2.0 etc. / installScript.tcl < prev    next >
Text File  |  1997-08-17  |  11KB  |  340 lines

  1. #===============================================================================
  2. #
  3. # installScript.tcl
  4. #
  5. # This file is used for installing HTML mode, CSS mode, JavaScript mode and Frontier menu.
  6. # See the file READ ME TO INSTALL.
  7. # Author: Johan Linde
  8. #
  9. #===============================================================================
  10.  
  11.  
  12. # Find which version of HTML mode is in folder.
  13. proc htmlGetHtmlVersion {folder} {
  14.     if {![file exists $folder:html.tcl]} {return "none"}
  15.     set cid [scancontext create]
  16.     set fid [open $folder:html.tcl]
  17.     
  18.     scanmatch $cid "editing HTML documents" {
  19.         regexp {HTML mode ([^:]+)} $matchInfo(line) dum version
  20.     }
  21.     
  22.     scanfile $cid $fid
  23.     close $fid
  24.     scancontext delete $cid
  25.     if {[info exists version]} {return [string trim $version]}
  26.     return "unknown"
  27. }
  28.  
  29. # Find which version of object is in folder.
  30. proc htmlGetVersion {folder object} {
  31.     if {$object == "htmlMode"} {return [htmlGetHtmlVersion $folder]}
  32.     if {![file exists $folder:$object.tcl]} {return "none"}
  33.     set cid [scancontext create]
  34.     set fid [open $folder:$object.tcl]
  35.     
  36.     scanmatch $cid "Version:" {
  37.         regexp {Version:(.*)} $matchInfo(line) dum version
  38.     }
  39.     
  40.     scanfile $cid $fid
  41.     close $fid
  42.     scancontext delete $cid
  43.     if {[info exists version]} {return [string trim $version]}
  44.     return "unknown"
  45. }
  46.  
  47. proc htmlModeFileList {version} {
  48.     switch -glob $version {
  49.         1.1beta {set files {html.tcl htmlElems.tcl htmlEngine.tcl htmlLevels.tcl htmlMode.tcl}}
  50.         1.1 {set files {html.tcl htmlElems.tcl htmlEngine.tcl htmlLevels.tcl htmlMode.tcl}}
  51.         1.1.1 {set files {html.tcl htmlElems.tcl htmlEngine.tcl htmlExtra.tcl htmlLevels.tcl htmlMode.tcl}}
  52.         1.2* {set files {html.tcl htmlCustom.tcl htmlElems.tcl htmlEngine.tcl htmlExtra.tcl htmlMenu.tcl htmlMode.tcl}}
  53.         1.3* {set files {html.tcl htmlCustom.tcl htmlElems.tcl htmlEngine.tcl htmlExtra.tcl htmlMenu.tcl htmlMode.tcl htmlUtils.tcl}}
  54.         1.4* {set files {html.tcl htmlCustom.tcl htmlElems.tcl htmlEngine.tcl htmlExtra.tcl htmlMenu.tcl htmlMode.tcl htmlUtils.tcl}}
  55.         2.0* {set files {cssMode.tcl hctsmsl.tcl hctsmslMenu.tcl hctsmslShared.tcl html.tcl html32.tcl 
  56.         htmlCustom.tcl htmlElems.tcl htmlEngine.tcl htmlExtensions.tcl htmlHomePageUtils.tcl htmlMenu.tcl htmlMode.tcl htmlStatusBar.tcl htmlUtils.tcl}}
  57.         default {set files {html.tcl htmlMode.tcl}}
  58.     }
  59.     return $files
  60. }
  61.  
  62. proc javaScriptModeFileList {version} {
  63.     return javaScriptMode.tcl
  64. }
  65.  
  66. proc frontierMenuFileList {version} {
  67.     return
  68. }
  69.  
  70. proc htmlModeHelpFiles {version} {
  71.     return {"HTML Help"}
  72. }
  73.  
  74. proc javaScriptModeHelpFiles {version} {
  75.     return
  76. }
  77.  
  78. proc frontierMenuHelpFiles {version} {
  79.     return {"Frontier Help"}
  80. }
  81.  
  82. proc htmlModeMenuFiles {version} {
  83.     return
  84. }
  85.  
  86. proc javaScriptModeMenuFiles {version} {
  87.     return
  88. }
  89.  
  90. proc frontierMenuMenuFiles {version} {
  91.     return frontierMenu.tcl
  92. }
  93.  
  94. proc htmlBackupObject {version object installFolder} {
  95.     global HOME PREFS
  96.     set text(htmlMode) "HTML mode"
  97.     set text(javaScriptMode) "JavaScript mode"
  98.     set text(frontierMenu) "Frontier menu"
  99.     if {[file exists "$HOME:$text($object) $version backup"]} {
  100.         set i 1
  101.         while {[file exists "$HOME:$text($object) $version backup.$i"]} {
  102.             incr i
  103.         }
  104.         mkdir [set folder "$HOME:$text($object) $version backup.$i"]
  105.     } else {
  106.         mkdir [set folder "$HOME:$text($object) $version backup"]
  107.     }
  108.     copyFile "$installFolder:installScript.tcl" "$folder:installScript.tcl"
  109.     copyFile "$installFolder:READ ME TO INSTALL" "$folder:READ ME TO INSTALL"
  110.     foreach fil [eval ${object}FileList $version] {
  111.         if {[file exists "$HOME:Tcl:Modes:$fil"]} {
  112.             copyFile "$HOME:Tcl:Modes:$fil" "$folder:$fil"
  113.         } else {
  114.             lappend missing $fil
  115.         }
  116.     }
  117.     foreach fil [eval ${object}HelpFiles $version] {
  118.         if {[file exists "$HOME:Help:$fil"]} {
  119.             copyFile "$HOME:Help:$fil" "$folder:$fil"
  120.         } else {
  121.             lappend missing $fil
  122.         }
  123.     }
  124.     foreach fil [eval ${object}MenuFiles $version] {
  125.         if {[file exists "$HOME:Tcl:Menus:$fil"]} {
  126.             copyFile "$HOME:Tcl:Menus:$fil" "$folder:$fil"
  127.         } else {
  128.             lappend missing $fil
  129.         }
  130.     }
  131.     if {$object == "htmlMode" && [file exists "$PREFS:HTMLadditions.tcl"]} {copyFile "$PREFS:HTMLadditions.tcl" "$folder:HTMLadditions.tcl"}
  132.     if {[info exists missing] && [lindex [dialog -w 250 -h 200 \
  133.         -t "The old files $missing are missing.\rBackup of $text($object) is inscomplete. Continue installation of $text($object)?" 10 10 240 160 \
  134.         -b Continue 20 170 85 190 -b Cancel 105 170 170 190] 1]} {
  135.         error "Abort installation."
  136.     }
  137. }
  138.  
  139. proc htmlRemoveObject {version object} {
  140.     global HOME
  141.     foreach fil [eval ${object}FileList $version] {
  142.         if {[file exists "$HOME:Tcl:Modes:$fil"]} {
  143.             removeFile "$HOME:Tcl:Modes:$fil"
  144.         }
  145.     }
  146.     foreach fil [eval ${object}HelpFiles $version] {
  147.         if {[file exists "$HOME:Help:$fil"]} {
  148.             removeFile "$HOME:Help:$fil"
  149.         }
  150.     }
  151.     foreach fil [eval ${object}MenuFiles $version] {
  152.         if {[file exists "$HOME:Tcl:Menus:$fil"]} {
  153.             removeFile "$HOME:Tcl:Menus:$fil"
  154.         }
  155.     }
  156. }
  157.  
  158. proc htmlExtraBackup {fil} {
  159.     global HOME
  160.     set backup "$HOME:Extra backup"
  161.     if {[file exists $backup] && ![file isdirectory $backup]} {
  162.         set i 1
  163.         while {[file exists $backup.$i] && ![file isdirectory $backup]} {incr i}
  164.         set backup $backup.$i
  165.     }
  166.     if {![file exists "$backup"]} {mkdir "$backup"}
  167.     set newfile "$backup:[file tail $fil]"
  168.     if {[file exists $newfile]} {
  169.         set i 1
  170.         while {[file exists $newfile.$i]} {incr i}
  171.         set newfile "$newfile.$i"
  172.     }
  173.     copyFile $fil $newfile
  174.     removeFile $fil
  175. }
  176.  
  177.     
  178. proc htmlInstallObject {version object installFolder} {
  179.     global HOME PREFS
  180.     foreach fil [eval ${object}FileList $version] {
  181.         if {[file exists "$HOME:Tcl:Modes:$fil"]} {htmlExtraBackup "$HOME:Tcl:Modes:$fil"}
  182.         copyFile "$installFolder:$fil" "$HOME:Tcl:Modes:$fil"
  183.     }
  184.     foreach fil [eval ${object}HelpFiles $version] {
  185.         if {[file exists "$HOME:Help:$fil"]} {htmlExtraBackup "$HOME:Help:$fil"}
  186.         copyFile "$installFolder:$fil" "$HOME:Help:$fil"
  187.     }
  188.     foreach fil [eval ${object}MenuFiles $version] {
  189.         if {[file exists "$HOME:Tcl:Menus:$fil"]} {htmlExtraBackup "$HOME:Tcl:Menus:$fil"}
  190.         copyFile "$installFolder:$fil" "$HOME:Tcl:Menus:$fil"
  191.     }
  192.     if {$object == "htmlMode" && [string index $version 0] == "2"} {
  193.         catch {removeFile "$HOME:Tcl:Modes:htmlLevels.tcl"}
  194.         catch {removeFile "$HOME:Tcl:Modes:htmlExtra.tcl"}
  195.     }
  196.     if {$object == "htmlMode" && [file exists "$installFolder:HTMLadditions.tcl"]} {
  197.         catch {removeFile "$PREFS:HTMLadditions.tcl"}
  198.         copyFile "$installFolder:HTMLadditions.tcl" "$PREFS:HTMLadditions.tcl"
  199.     }
  200. }
  201.  
  202. proc HTMLmodeInstaller {installFolder} {
  203.     global HOME PREFS
  204.  
  205.     set text(htmlMode) "HTML mode"
  206.     set text(javaScriptMode) "JavaScript mode"
  207.     set text(frontierMenu) "Frontier menu"
  208.     set maxVers(htmlMode) {^1\.|^2\.0}
  209.     set maxVers(javaScriptMode) {^1\.0}
  210.     set maxVers(frontierMenu) {^1\.|^2\.0}
  211.     
  212.     set minVers 6.2
  213.     # Build a dialog
  214.     set box "-t {Select what to install and what to backup} 50 10 350 30"
  215.     set h 50
  216.     foreach object {htmlMode javaScriptMode frontierMenu} {
  217.         set $object 1
  218.         set vers [htmlGetVersion $installFolder $object]
  219.         if {$vers == "none"} {
  220.             set $object 0
  221.             continue
  222.         }
  223.         if {$vers == "unknown"} {
  224.             alertnote "Could not find out which version of $text($object) there is in this folder. Can't install."
  225.             set $object 0
  226.             continue
  227.         }
  228.         if {![regexp $maxVers($object) $vers]} {
  229.             # Version to install is too new for this script.
  230.             alertnote "Sorry, don't know how to install $text($object) $vers."
  231.             continue
  232.         }
  233.         if {$object == "htmlMode" && [string index $vers 0] == "2"} {
  234.             set cssVers [htmlGetVersion $installFolder cssMode]
  235.             if {$cssVers == "none"} {
  236.                 set $object 0
  237.                 continue
  238.             }
  239.             if {$cssVers == "unknown"} {
  240.                 alertnote "Could not find out which version of CSS mode there is in this folder. Can't install."
  241.                 set $object 0
  242.                 continue
  243.             }            
  244.         }
  245.         set currFolder $HOME:Tcl:Modes
  246.         if {$object == "frontierMenu"} {set currFolder $HOME:Tcl:Menus}
  247.         set currVers [htmlGetVersion $currFolder $object]
  248.         if {$currVers != "none" && $currVers != "unknown" && ![regexp $maxVers($object) $currVers]} {
  249.             # Current version is to new for this script.
  250.             alertnote "$text($object) $currVers is installed. Can't replace it by $text($object) $vers."
  251.             continue
  252.         }
  253.         # Check that all files to install exist.
  254.         set allfound 1
  255.         foreach fil [concat [eval ${object}FileList vers] [eval ${object}HelpFiles $vers] [eval ${object}MenuFiles $vers]] {
  256.             if {![file exists "$installFolder:$fil"]} {
  257.                 alertnote "The file $fil is missing. Can't install $object($text)."
  258.                 set allfound 0
  259.                 break
  260.             }
  261.         }
  262.         if {!$allfound} {continue}
  263.         
  264.         set modetext "$text($object) $vers"
  265.         if {$object == "htmlMode" && [string index $vers 0] == "2"} {
  266.             append modetext " and CSS mode $cssVers"
  267.             set minVers 6.51
  268.         }
  269.         append box " -c [list $modetext] [expr (\"$vers\" != \"$currVers\")] 10 $h 350 [expr $h + 25]"
  270.         incr h 20
  271.         if {$object == "htmlMode" && [string index $currVers 0] == "2"} {set currCSS [htmlGetVersion $currFolder cssMode]}
  272.         set currtext "Currently installed: $currVers"
  273.         set backup$object 1
  274.         if {$currVers == "none"} {set backup$object 0}
  275.         if {$currVers == "unknown"} {set backup$object 0}
  276.         if {$object == "htmlMode" && [string index $currVers 0] == "2"} {append currtext " and $currCSS"}
  277.         append box " -t [list $currtext] 10 $h 350 [expr $h + 15]"
  278.         incr h 20
  279.         if {[set backup$object]} {append box " -c {Make backup before installing} [expr (\"$vers\" != \"$currVers\")] 30 $h 350 [expr $h + 15]"; incr h 20}
  280.         incr h 10
  281.         set new$object $vers
  282.         set curr$object $currVers
  283.     }
  284.     
  285.     if {!$htmlMode && !$javaScriptMode && !$frontierMenu} {
  286.         alertnote "Found nothing to install."
  287.     }
  288.     # Check that Alpha is recent enough.
  289.     regexp {([0-9]+\.[0-9]+)[ab]?([0-9]*)} [version] dum Avers versbeta
  290.     if {$Avers < $minVers || ($Avers == $minVers && $versbeta != "")} {
  291.         alertnote "You need Alpha $minVers or later."
  292.         return
  293.     }
  294.     # Ask what to install.
  295.     set values [eval [concat dialog -w 360 -h [expr $h + 30] -b Install 20 $h 85 [expr $h + 20] \
  296.         -b Cancel 115 $h 180 [expr $h + 20] $box]]
  297.     
  298.     if {[lindex $values 1]} {return}
  299.     
  300.     # Make backups.
  301.     set i 1
  302.     foreach object {htmlMode javaScriptMode frontierMenu} {
  303.         if {![set $object]} {continue}
  304.         incr i
  305.         if {![set backup$object]} {continue}
  306.         incr i
  307.         if {![lindex $values [expr $i - 1]] || ![lindex $values $i]} {continue}
  308.         message "Making backup of $text($object) [set curr$object]…"
  309.         if {[catch {htmlBackupObject [set curr$object] $object $installFolder}]} {
  310.             alertnote "Making backup failed. Installation cancelled. No files have been deleted."
  311.             return
  312.         }
  313.     }
  314.     # Make installations
  315.     set installSomething 0
  316.     set i 1
  317.     foreach object {htmlMode javaScriptMode frontierMenu} {
  318.         if {![set $object]} {continue}
  319.         incr i
  320.         if {![lindex $values $i]} {
  321.             if {[set backup$object]} {incr i}
  322.             continue
  323.         }
  324.         if {[set backup$object]} {incr i}
  325.         set installSomething 1
  326.         message "Installing $text($object) [set new$object]…"
  327.         if {([set backup$object] && [catch {htmlRemoveObject [set curr$object] $object}]) || [catch {htmlInstallObject [set new$object] $object  $installFolder}]} {
  328.             alertnote "Installation failed. Some of the old files may have been removed. Use the backup to reinstall the old version or try installing again."
  329.             return
  330.         }
  331.     }
  332.     if {!$installSomething} {alertnote "Nothing was installed."; return}
  333.     rebuildTclIndices
  334.     if {[lindex [dialog -w 300 -h 100 -t "Installation was successful. You must now restart Alpha." 10 10 290 50 \
  335.         -b Quit 20 70 85 90 -b Cancel 105 70 170 90] 0]} {quit}
  336. }
  337.  
  338.